home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / tcp_ip / wnos / wn941101 / fingerd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-10  |  2.1 KB  |  101 lines

  1. /* Finger server */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "global.h"
  5. #include "files.h"
  6. #include "mbuf.h"
  7. #include "socket.h"
  8. #include "session.h"
  9. #include "proc.h"
  10. #include "dirutil.h"
  11. #include "commands.h"
  12. #include "mailbox.h"
  13.  
  14. static int Sfinger = -1;    /* Prototype socket for service */
  15.  
  16. static void
  17. fingerd(s,unused,p)
  18. int s;
  19. void *unused;
  20. void *p;
  21. {
  22.     FILE *fp;
  23.     char *file, *cp, user[80];
  24.  
  25.     sockmode(s,SOCK_ASCII);
  26.     sockowner(s,Curproc);
  27.     log(s,"FING open");
  28.  
  29.     if(recvline(s,user,sizeof(user)) >= 0) {
  30.         rip(user);
  31.         if(strlen(user) == 0)
  32.             usputs(s,((fp = dir(Fdir,0)) == NULLFILE) ?
  33.                 "No finger information available\n" :
  34.                 "Known users on this system:\n");
  35.         else {
  36.             file = pathname(Fdir,user);
  37.             cp = pathname(Fdir,"");
  38.             /* Check for attempted security violation (e.g., somebody
  39.              * might be trying to finger "../ftpusers"!)
  40.              */
  41.             if(strncmp(file,cp,strlen(cp)) != 0){
  42.                 fp = NULLFILE;
  43.                 usputs(s,"Invalid user name\n");
  44.             } else if((fp = fopen(file,READ_TEXT)) == NULLFILE)
  45.                 usprintf(s,"Unknown user '%s'\n",user);
  46.             xfree(cp);
  47.             xfree(file);
  48.         }
  49.         if(fp != NULLFILE){
  50.             sendfile(fp,s,ASCII_TYPE,0);
  51.             fclose(fp);
  52.         }
  53.     }
  54.     log(s,"FING close");
  55.     close_s(s);
  56. }
  57.  
  58. /* Start up finger service */
  59. int
  60. finstart(argc,argv,p)
  61. int argc;
  62. char *argv[];
  63. void *p;
  64. {
  65.     struct sockaddr_in lsocket;
  66.     int s;
  67.  
  68.     if(Sfinger != -1){
  69.         return 0;
  70.     }
  71.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  72.     chname(Curproc,"Finger listener");
  73.  
  74.     lsocket.sin_family = AF_INET;
  75.     lsocket.sin_addr.s_addr = INADDR_ANY;
  76.     lsocket.sin_port = (argc < 2) ? IPPORT_FINGER : atoi(argv[1]);
  77.  
  78.     Sfinger = socket(AF_INET,SOCK_STREAM,0);
  79.     bind(Sfinger,(char *)&lsocket,sizeof(lsocket));
  80.     listen(Sfinger,1);
  81.     for(;;){
  82.         if((s = accept(Sfinger,NULLCHAR,NULLINT)) == -1)
  83.             break;    /* Service is shutting down */
  84.  
  85.         /* Spawn a server */
  86.         newproc("fingerd",1024,fingerd,s,0,NULL,0);
  87.     }
  88.     return 0;
  89. }
  90.  
  91. int
  92. fin0(argc,argv,p)
  93. int argc;
  94. char *argv[];
  95. void *p;
  96. {
  97.     close_s(Sfinger);
  98.     Sfinger = -1;
  99.     return 0;
  100. }
  101.